#ifndef _SystemClockSynchronizer_h_
#define _SystemClockSynchronizer_h_

#include <chrono>
#include <mutex>
#include "ISynchronizer.h"

class Decoder;

class SystemClockSynchronizer : public ISynchronizer {

    Q_OBJECT
    Q_INTERFACES(ISynchronizer)
    Q_PROPERTY(Decoder* decoder READ decoder WRITE setDecoder NOTIFY decoderChanged FINAL)

public:
    SystemClockSynchronizer()
        : m_accumulatedTime(0.0),
        m_maxDuration(0.0),
        m_speed(1.0),
        m_playing(false),
        m_paused(false)
    {}

    // 返回已经过去的时间（单位：秒）
    double clock() override;

    // 返回是否处于暂停状态
    bool isPausing() override {
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_paused;
    }

    // 请求暂停
    void pause() override;

    // 从暂停状态恢复到播放状态
    void resume() override;

    // 开始播放
    void start() override;

    // 结束播放，重置状态
    void stop() override {
        std::lock_guard<std::mutex> lock(m_mutex);
        m_playing = false;
        m_paused = false;
        m_accumulatedTime = 0.0;
    }

    // 设置视频总长度（单位：秒）
    void setMaxDuration(double maxDuration) override {
        std::lock_guard<std::mutex> lock(m_mutex);
        m_maxDuration = maxDuration;
    }

    // 跳转到指定时间点（单位：秒）
    void seek(double timepoint) override;

    // 设置播放速率，speed表示速度倍率（默认1.0）
    void setPresentSpeed(double speed) override;

    // 返回当前播放速率
    double presentSpeed() override {
        std::lock_guard<std::mutex> lock(m_mutex);
        return m_speed;
    }

    Decoder *decoder() const;
    void setDecoder(Decoder *newDecoder);

signals:
    void decoderChanged();

private:
    // 互斥锁，用于保护共享状态
    std::mutex m_mutex;

    // 记录上次开始计时的时间点
    std::chrono::steady_clock::time_point m_startTime;
    // 已累计的播放时间（单位：秒）
    double m_accumulatedTime;
    // 视频的总时长（单位：秒），如果大于0，则 clock() 的返回值不会超过此值
    double m_maxDuration;
    // 播放速率
    double m_speed;
    // 标识是否已经开始播放
    bool m_playing;
    // 标识是否处于暂停状态
    bool m_paused;
    Decoder *m_decoder = nullptr;
};


#endif
